#include <string.h>
#include <iostream>
using std::cout;
using std::endl;
//关于指针数据成员，应该如何处理？？？？？？
//指针数据成员也像其他数据成员一样，直接进行赋值操作可以吗？？？
//初始化列表中的括号你就可以理解为是=
//_brand =brand浅拷贝
//目前阶段，建议不要去使用，等基础知识全部学完了之后
//如果外部的brand指针释放了堆空间的这块区域
//那么当前的类对象里面的属性成员便无法使用了，受制于人
//_price = price
class Computer{
public:
    Computer(const char * brand, float price)
        //因为new和delete没有成对出现
        //_brand = new char[strlen(pstr) + 1]();
    :_brand(new char[strlen(brand) + 1]())
    ,_price(price)
    {
        strcpy(_brand ,brand);
        cout << "Computer(const char *, float)" << endl;
    }

    void print(){
        cout << "_brand=" << _brand << ",_price=" << _price << endl;
    }

    //析构函数：有且只有一个
    //该函数会在对象即将被销毁的时候调用
    //但是不是说调用析构函数会导致对象的销毁
    //而是对象的销毁之前会调用析构函数
    ~Computer(){
        //执行delete操作
        cout << "~Computer" << endl;
        if(_brand){
            delete [] _brand;
            //这一步操作不可以少
            _brand = nullptr;
        }
    }


private:
    char * _brand;
    float _price;
};
void test3(){
    Computer c("Huawei matebook", 12000);
    c.print();
    //构造函数，没法利用对象.xxx形式进行调用
    //析构函数能否利用对象.xx形式进行调用呢？？？？
    //不推荐，但是可以这么去干
    //开发人员自己主动调用了一次，后续对象被销毁的时候
    //还会被调用一次
    c.~Computer();
}


void test(){
    char * pstr = new char[6]();
    strcpy(pstr, "hello");

    //浅拷贝
    char * pstr2 = pstr;

    cout << pstr << endl;
    cout << pstr2 << endl;

    delete [] pstr;
    pstr = nullptr;
    cout << "================" << endl;
    cout << pstr << endl;
    cout << pstr2 << endl;
    delete [] pstr2;//如果pstr2也执行delete操作会出现double free
    pstr2 = nullptr;
}

void test2(){
    char * pstr = new char[6]();
    strcpy(pstr, "hello");
    cout << pstr << endl;
    //深拷贝代码
    char * pstr2 = new char[strlen(pstr) + 1]();
    strcpy(pstr2, pstr);
    cout << pstr2 << endl;

    delete [] pstr;
    pstr = nullptr;
    cout << pstr2 << endl;

    delete [] pstr2;
    pstr2 = nullptr;
}

int main()
{
    test3();
    return 0;
}

